package controllers;

import play.*;
import play.cache.Cache;
import play.data.validation.Valid;
import play.db.jpa.Blob;
import play.i18n.Lang;
import play.libs.Crypto;
import play.libs.Images;
import play.libs.Mail;
import play.libs.OAuth2;
import play.libs.WS;
import play.mvc.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.commons.io.IOUtils;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.SimpleEmail;



import com.google.gson.JsonObject;

import models.*;

public class Application extends Controller {

	public static void index() {
				
	String lang = Lang.get();
		Lang.change(lang);

		List<Usuario> contacts = Cache.get("contacts", List.class);
		if (contacts == null) {
			contacts = Usuario.all().fetch();
			Cache.set("contacts", contacts, "30mn");
		}
 
		List<Experiencia> experiencia = Cache.get("experiencia", List.class);

		experiencia = Experiencia.all().fetch(6);
		Cache.set("experiencia", experiencia, "30mn");

		render(experiencia);
	}

	public static void login(Speakr usuario) {
		Crypto a = new Crypto();
		String senha = a.encryptAES(usuario.spe_senha);
		Speakr user = Speakr.find("bySpe_nomeAndSpe_senha", usuario.spe_nome,
				senha).first();
		if (user != null && user.spe_role.equalsIgnoreCase("gestor")) {
			session.put("user", user.spe_nome);
			Speakr speakr = new Speakr();
			Speakrs.cadastrar(speakr);
		}
		if (user != null){	
			session.put("user", user.spe_nome);
			Speakrs.perfil(user);
		}
		// Oops
		flash.put("username", usuario.spe_nome);
		flash.error("Login failed");
		logar();
	}

	public static void logar() {

		render();
	}

	static Speakr connected() {
		if (renderArgs.get("user") != null) {
			return renderArgs.get("user", Speakr.class);
		}
		String username = session.get("user");
		if (username != null) {
			return Speakr.find("bySpe_nome", username).first();
		}
		return null;
	}

	public static void logout() {
		session.clear();
		index();
	}

	public static void registrar() {

		render();
	}

	public static void registrar(String erro) {

		render(erro);
	}

	public static void tipoSpeakrs() {

		render();
	}

	public static void recuperarsenha() {

		render();
	}

	  @Before
	    static void addUser() {
	    	Speakr user = connected();
	        if(user != null) {
	            renderArgs.put("user", user);
	        }
	    }
	
	public static void maisexperiencias() {

		List<Experiencia> experiencia = Cache.get("experiencia", List.class);

		experiencia = Experiencia.all().fetch(6);
		Cache.set("experiencia", experiencia, "30mn");
		render(experiencia);

	}

	public static void inscreverMail(String pro_titulo) {
		//String id = params.get("pro_titulo", String.class);
		SimpleEmail emailt = new SimpleEmail(); 

		try { 
			emailt.setDebug(true); 
			emailt.setHostName("smtp.gmail.com"); 
			emailt.setSSL(true);
			emailt.setAuthentication("odilionoronha@gmail.com","97232069");	
			emailt.setSmtpPort(25);
	System.out.println("testettete");
			emailt.addTo(pro_titulo); 
			emailt.setFrom("odilionoronha@gmail.com"); 
			emailt.setSubject("Inscrição no Speakrs"); 
			emailt.setMsg("A nossa comunidade de viajantes independentes e Fala está crescendo dia a dia e estamos felizes que você se juntou a nós. "
					+ " Você está procurando uma nova experiência? Faremos o nosso melhor para encontrar a pessoa que você precisa."
					+ "Para mais informações, envie-nos um e-mail para info@speakr.co"); 
			emailt.send(); 

		} catch (EmailException e) { 

		System.out.println(e.getMessage()); 

		} 
		Email email = new Email();
		email.ema_email = pro_titulo;
		email.save();
		index();

	}

	public static void contatoMail(String ema_nome,String ema_email,String contatoTexto) {
		SimpleEmail emailt = new SimpleEmail(); 

		try { 
			emailt.setDebug(true); 
			emailt.setHostName("smtp.gmail.com"); 
			emailt.setSSL(true);
			emailt.setAuthentication("odilionoronha@gmail.com","97232069");	
			emailt.setSmtpPort(25);
	
			emailt.addTo(ema_email); 
			emailt.setFrom("odilionoronha@gmail.com"); 
			emailt.setSubject("Contato com o Speakrs"); 
			emailt.setMsg("A nossa comunidade de viajantes independentes e Fala está crescendo dia a dia e estamos felizes que você se juntou a nós. "
					+ " Você está procurando uma nova experiência? Faremos o nosso melhor para encontrar a pessoa que você precisa."
					+ "Para mais informações, envie-nos um e-mail para info@speakr.co"); 
			emailt.send(); 

		} catch (EmailException e) { 

		System.out.println(e.getMessage()); 

		} 
		Email email = new Email();
		email.ema_email = ema_email;
		email.ema_nome = ema_nome;
		email.ema_texto = contatoTexto;
		email.save();
		
		index();

	}

	public static void saveUser(@Valid Speakr user, String verifyPassword) {
		validation.required(verifyPassword).message("Campo Obrigatorio!");
		validation.equals(verifyPassword, user.spe_senha).message(
				"Seu password não confere");

		if (validation.hasErrors()) {
			render("@registrar", user, verifyPassword);
		}
		if (Speakr.find("bySpe_nome", user.spe_nome).first() == null) {
			Crypto a = new Crypto();
			String senha = a.encryptAES(user.spe_senha);
			user.spe_senha = senha;
			Blob usu_ima = user.spe_ima;
			user.spe_role ="speakr";
			user.save();
			if (usu_ima != null) {

				File outputFile = Play.getFile("/public/images/avatar/"
						+ user.spe_nome + user.spe_codigo + ".jpg");
				Images.resize(usu_ima.getFile(), outputFile, 100, -1);
				user.spe_caminho_ima = "http://speakrs.me/public/images/avatar/"
						+ user.spe_nome + user.spe_codigo + ".jpg";
				user.save();
				// IOUtils.copy(iStream, new FileOutputStream(outputFile));

			}
			session.put("user", user.spe_nome);
			
			Speakrs.perfil(user); 
		} else {
			registrar("login já esxiste!");
		}
	}

	public static void alterUser(@Valid Usuario user) {
		Blob usu_ima = user.usu_ima;
		user.save();

		FileInputStream iStream;
		if (usu_ima != null) {
			try {
				iStream = new FileInputStream(usu_ima.getFile());

				File outputFile = Play.getFile("/public/images/avatar/"
						+ user.usu_nome + user.usu_codigo + ".jpg");
				Images.resize(user.usu_ima.getFile(), outputFile, 100, -1);
				user.usu_caminho_ima = "http://speakrs.me/public/images/avatar/"
						+ user.usu_nome + user.usu_codigo + ".jpg";
				user.save();

			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		session.put("user", user.usu_nome);
		// Timeline.teste();
	}

	public static void userPhoto(int id) {
		final Usuario user = Usuario.findById(id);
		notFoundIfNull(user);
		response.setContentTypeIfNotSet(user.usu_ima.type());
		renderText(user.usu_caminho_ima);
	}

	

	public static void mudarIdioma(int id) {
		if (id == 1)
			Lang.change("en");
		else if (id == 2)
			Lang.change("pt");
		else if (id == 3)
			Lang.change("sp");
		if (renderArgs.get("user") != null) {
			// Timeline.teste();
		}

	}
	
	

	public static void mudar() {
		System.out.println("ajax");

	}
	

	
	
	
	
	
	
	
	
	
	
	 public static OAuth2 FACEBOOK = new OAuth2(
	            "https://graph.facebook.com/oauth/authorize",
	            "https://graph.facebook.com/oauth/access_token",
	            "291857904312787",
	            "e79d4e7b2450e7cd485317763353d1d1"
	    );

	    public static void face(Speakr u) {
	        
	        Logger.info("nuloooo " );
	        JsonObject me = null;
	        JsonObject outro = null;
	        String a = null;
	        Logger.info("usuario  " + u.spe_codigo);
	        if (u != null && u.access_token != null) {


	            me = WS.url("https://graph.facebook.com/me?access_token=%s", WS.encode(u.access_token)).get().getJson().getAsJsonObject();

	            
	           a = WS.url("http://graph.facebook.com/"+me.get("id").toString().replaceAll("\"", "")+"/picture").url;
	           u.spe_nome = me.get("name").toString();
	           u.spe_caminho_ima = a;
	           u.save();
	           session.put("username", u.spe_nome);
	          // renderArgs.put("username", u.usu_nome);
	           //session.put("user", u);
	           //renderArgs.put("user", u);
	           Logger.info("dentro do info  " + u.access_token);
	           
	           Speakrs.perfil(u);      
	            
	           
	        }
	        Logger.info("code repossss " + u.access_token);
	        render(me,outro,a);
	    }

	    public static void auth() {
	        if (OAuth2.isCodeResponse()) {
	        	Speakr u = new Speakr();
	            OAuth2.Response response = FACEBOOK.retrieveAccessToken(authURL());
	            u.access_token = response.accessToken;
	            
	            //u.save();
	            session.put("user", u);
	            renderArgs.put("user", u);
	            
	            Logger.info("token da merda do usuario "+ u.access_token );
	            face(u);
	        }
	        FACEBOOK.retrieveVerificationCode(authURL());
	    }

	   

	    static String authURL() {
	        return play.mvc.Router.getFullUrl("Application.auth");
	    }

	   
	
	
}